/*
 *  FreeLoader
 *  Copyright (C) 1998-2003  Brian Palmer  <brianp@sginet.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#pragma once

#define TUI_TITLE_BOX_CHAR_HEIGHT    5

///////////////////////////////////////////////////////////////////////////////////////
//
// Textual User Interface Functions
//
///////////////////////////////////////////////////////////////////////////////////////
BOOLEAN    TuiInitialize(VOID);                                    // Initialize User-Interface
VOID    TuiUnInitialize(VOID);                                    // Un-initialize User-Interface

VOID    TuiDrawBackdrop(VOID);                                    // Fills the entire screen with a backdrop
VOID    TuiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, CHAR FillChar, UCHAR Attr /* Color Attributes */);    // Fills the area specified with FillChar and Attr
VOID    TuiDrawShadow(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom);    // Draws a shadow on the bottom and right sides of the area specified
VOID    TuiDrawBox(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr);    // Draws a box around the area specified
VOID    TuiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr);    // Draws text at coordinates specified
VOID    TuiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr);    // Draws text at coordinates specified
VOID    TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr);    // Draws centered text at the coordinates specified and clips the edges
VOID    TuiDrawStatusText(PCSTR StatusText);                    // Draws text at the very bottom line on the screen
VOID    TuiUpdateDateTime(VOID);                                // Updates the date and time
VOID    TuiSaveScreen(PUCHAR Buffer);                            // Saves the screen so that it can be restored later
VOID    TuiRestoreScreen(PUCHAR Buffer);                        // Restores the screen from a previous save
VOID    TuiMessageBox(PCSTR MessageText);                        // Displays a message box on the screen with an ok button
VOID    TuiMessageBoxCritical(PCSTR MessageText);                // Displays a message box on the screen with an ok button using no system resources
VOID    TuiDrawProgressBarCenter(ULONG Position, ULONG Range, PCHAR ProgressText);            // Draws the progress bar showing nPos percent filled
VOID    TuiDrawProgressBar(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, ULONG Position, ULONG Range, PCHAR ProgressText);            // Draws the progress bar showing nPos percent filled
BOOLEAN    TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length);
int    TuiPrintf(const char *format, ... );
UCHAR    TuiTextToColor(PCSTR ColorText);                        // Converts the text color into it's equivalent color value
UCHAR    TuiTextToFillStyle(PCSTR FillStyleText);                // Converts the text fill into it's equivalent fill value

VOID    TuiFadeInBackdrop(VOID);                                // Draws the backdrop and fades the screen in
VOID    TuiFadeOut(VOID);                                        // Fades the screen out

///////////////////////////////////////////////////////////////////////////////////////
//
// Menu Functions
//
///////////////////////////////////////////////////////////////////////////////////////

VOID  TuiCalcMenuBoxSize(PUI_MENU_INFO MenuInfo);
VOID  TuiDrawMenu(PUI_MENU_INFO MenuInfo);
VOID  TuiDrawMenuBox(PUI_MENU_INFO MenuInfo);
VOID  TuiDrawMenuItem(PUI_MENU_INFO MenuInfo, ULONG MenuItemNumber);
ULONG TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo, UiMenuKeyPressFilterCallback KeyPressFilter);

BOOLEAN
TuiDisplayMenu(
    IN PCSTR MenuHeader,
    IN PCSTR MenuFooter OPTIONAL,
    IN BOOLEAN ShowBootOptions,
    IN PCSTR MenuItemList[],
    IN ULONG MenuItemCount,
    IN ULONG DefaultMenuItem,
    IN LONG MenuTimeOut,
    OUT PULONG SelectedMenuItem,
    IN BOOLEAN CanEscape,
    IN UiMenuKeyPressFilterCallback KeyPressFilter OPTIONAL,
    IN PVOID Context OPTIONAL);

/* Definitions for corners, depending on HORIZ and VERT */
#define UL        (0xda)
#define UR        (0xbf)  /* HORZ and VERT */
#define LL        (0xc0)
#define LR        (0xd9)

#define D_UL    (0xc9)
#define D_UR    (0xbb)  /* D_HORZ and D_VERT */
#define D_LL    (0xc8)
#define D_LR    (0xbc)

#define HD_UL    (0xd5)
#define HD_UR    (0xb8)  /* D_HORZ and VERT */
#define HD_LL    (0xd4)
#define HD_LR    (0xbe)

#define VD_UL    (0xd6)
#define VD_UR    (0xb7)  /* HORZ and D_VERT */
#define VD_LL    (0xd3)
#define VD_LR    (0xbd)

extern const UIVTBL TuiVtbl;
